﻿using System;
using System.Collections.Generic;
using System.Text;
using SistemaLib.sipe.db.sqlserver;
using SistemaLib.Entidades;
using SistemaLib.sipe.db.general;
using SistemaLib.sipe.util;
using System.Data;

namespace SistemaLib.Persistencia
{
    public class DbRecurso : DbBase
    {
        private void Cargar(DataRow fila, Recurso obj)
        {
            obj.Id = ObtieneCampo.TipoInt(fila, "id");
            obj.Nombre = ObtieneCampo.TipoString(fila, "nombre");
            obj.Horas = ObtieneCampo.TipoMoneda(fila, "horas");
            obj.Sueldo = ObtieneCampo.TipoMoneda(fila, "sueldo");
            obj.IdPerfil = ObtieneCampo.TipoInt(fila, "idPerfil");
            obj.IdSeniority = ObtieneCampo.TipoInt(fila, "idSeniority");
            obj.IdConocimientos = ObtieneCampo.TipoInt(fila, "idConocimientos");
            obj.Usuario = ObtieneCampo.TipoString(fila, "usuario");
            obj.Clave = ObtieneCampo.TipoString(fila, "clave");
        }

        public Recurso CargarRecursoPorId(int idRecurso)
        {
            Recurso obj = new Recurso();

            string sql = @"select * from RecursosHumanos where id = @idRecurso";

            DataSet ds;

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@idRecurso", DbTipo.Entero, 0, idRecurso));

            this.DbConnection.RunDataSetProcedure(sql, col, CommandType.Text, out ds);

            if (ds != null && ds.Tables[0].Rows.Count > 0)
            {
                DataRow fila = ds.Tables[0].Rows[0];
                Cargar(fila, obj);
            }

            return obj;
        }

        public DataSet ListarRecursos()
        {
            string sql = @"select * from RecursosHumanos order by nombre";

            DataSet ds;

            this.DbConnection.RunDataSetProcedure(sql, CommandType.Text, out ds);

            return ds;
        }

        public DataSet ListarRecursosParaComboDetallado()
        {
            string sql = @"select r.*, p.descripcion as perfil, s.descripcion as seniority
                            from RecursosHumanos r
                            join perfiles p on r.idPerfil = p.id
                            join seniorities s on r.idSeniority = s.id
                            order by nombre";

            DataSet ds;

            this.DbConnection.RunDataSetProcedure(sql, CommandType.Text, out ds);

            return ds;
        }


        public Recurso DoLogin(string usuario, string clave)
        {
            string sql = "select * from RecursosHumanos where usuario = @usuario and clave = @clave";
            Recurso rec = new Recurso();
            DataSet ds;

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@usuario", DbTipo.Cadena, 0, usuario));
            col.Add(DbConnection.SqlInputParam("@clave", DbTipo.Cadena, 0, clave));

            this.DbConnection.RunDataSetProcedure(sql, col, CommandType.Text, out ds);

            if (ds.Tables[0].Rows.Count > 0)
                Cargar(ds.Tables[0].Rows[0], rec);

            return rec;
        }

        public DataSet ListarRecursosAsignadosATarea(int idTar)
        {
            string sql = @"select r.*, p.descripcion as perfil, s.descripcion as seniority
                            from RecursosHumanos r
                            join perfiles p on r.idPerfil = p.id
                            join seniorities s on r.idSeniority = s.id
                            join TareasAsignaciones ta on ta.idRH = r.id 
                            where idTarea = @idTarea
                            order by nombre";
            
            DataSet ds;

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@idTarea", DbTipo.Cadena, 0, idTar));

            this.DbConnection.RunDataSetProcedure(sql, col, CommandType.Text, out ds);
            
            return ds;
        }
        
        public void Agregar(Recurso rec)
        {
            DbScriptGenerator sql = new DbScriptGenerator();

            sql.Tabla = "RecursosHumanos";
            sql.addCampo("nombre");
            sql.addCampo("sueldo");
            sql.addCampo("idPerfil");
            sql.addCampo("idSeniority");
            sql.addCampo("horas");
            sql.addCampo("idConocimiento");
            sql.addCampo("usuario");
            sql.addCampo("clave");

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@nombre", DbTipo.Cadena, 0, rec.Nombre));
            col.Add(DbConnection.SqlInputParam("@sueldo", DbTipo.Moneda, 0, rec.Sueldo));
            col.Add(DbConnection.SqlInputParam("@idPerfil", DbTipo.Entero, 0, rec.IdPerfil));
            col.Add(DbConnection.SqlInputParam("@idSeniority", DbTipo.Entero, 0, rec.IdSeniority));
            col.Add(DbConnection.SqlInputParam("@horas", DbTipo.Float, 0, rec.Horas));
            col.Add(DbConnection.SqlInputParam("@idConocimiento", DbTipo.Entero, 0, rec.IdConocimientos));
            col.Add(DbConnection.SqlInputParam("@usuario", DbTipo.Cadena, 0, rec.Usuario));
            col.Add(DbConnection.SqlInputParam("@clave", DbTipo.Cadena, 0, rec.Clave));


            object id;
            this.DbConnection.RunScalarProcedure(sql.getInsert(), col, CommandType.Text, out id);

            rec.Id = int.Parse(id.ToString());
        }

        public void Modificar(Recurso rec)
        {
            DbScriptGenerator sql = new DbScriptGenerator();

            sql.Tabla = "RecursosHumanos";
            sql.CampoClave = "id";
            sql.addCampo("nombre");
            sql.addCampo("sueldo");
            sql.addCampo("idPerfil");
            sql.addCampo("idSeniority");
            sql.addCampo("horas");
            sql.addCampo("idConocimiento");
            sql.addCampo("usuario");
            sql.addCampo("clave");

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@id", DbTipo.Entero, 0, rec.Id));
            col.Add(DbConnection.SqlInputParam("@nombre", DbTipo.Cadena, 0, rec.Nombre));
            col.Add(DbConnection.SqlInputParam("@sueldo", DbTipo.Moneda, 0, rec.Sueldo));
            col.Add(DbConnection.SqlInputParam("@idPerfil", DbTipo.Entero, 0, rec.IdPerfil));
            col.Add(DbConnection.SqlInputParam("@idSeniority", DbTipo.Entero, 0, rec.IdSeniority));
            col.Add(DbConnection.SqlInputParam("@horas", DbTipo.Float, 0, rec.Horas));
            col.Add(DbConnection.SqlInputParam("@idConocimiento", DbTipo.Entero, 0, rec.IdConocimientos));
            col.Add(DbConnection.SqlInputParam("@usuario", DbTipo.Cadena, 0, rec.Usuario));
            col.Add(DbConnection.SqlInputParam("@clave", DbTipo.Cadena, 0, rec.Clave));
            
            int id;
            this.DbConnection.RunNonQueryProcedure(sql.getUpdate(), col, CommandType.Text, out id);
        }

        internal void Eliminar(int idRecurso)
        {
            string sql = "delete from RecursosHumanos where id = @id";

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@id", DbTipo.Entero, 0, idRecurso));

            int cant;
            this.DbConnection.RunNonQueryProcedure(sql, col, CommandType.Text, out cant);
        }

        internal void Guardar(Recurso recurso)
        {
            if (recurso.Id == 0)
                Agregar(recurso);
            else
                Modificar(recurso);
        }

        public DataSet ReporteCostoRecursos(int idProyecto)
        {
            string sql = @"select 
                            rec.nombre,
                            rec.sueldo,
                            isnull((select SUM(tas.horas)from TareasAsignaciones tas join RecursosHumanos rh on tas.idRH = rh.id join Tareas tar on tar.id = tas.idTarea where idRH = rec.id and tar.idProyecto = @idProyecto), 0) as horasTrabajadas,
                            isnull((select SUM(tas.horas * (rh.sueldo / 22 / rh.horas)) from TareasAsignaciones tas join RecursosHumanos rh on tas.idRH = rh.id join Tareas tar on tar.id = tas.idTarea where idRH = rec.id and tar.idProyecto = @idProyecto), 0) as costoRecurso
                            from RecursosHumanos rec";

            DataSet ds;

            DbParameterCollection col = new DbParameterCollection();
            col.Add(DbConnection.SqlInputParam("@idProyecto", DbTipo.Entero, 0, idProyecto));

            this.DbConnection.RunDataSetProcedure(sql, col, CommandType.Text, out ds);

            return ds;
        }



    }
}
